单关系数据查询结构
数据查询是数据库中最常用的操作,SQL 提供 SELECT 语句来获取所需信息
无条件查询(投影查询)
只包含 SELECT…FROM 的查询,相当于关系代数中的投影运算
无条件查询不包含 WHERE 子句,只从表中选取指定的列(投影)。
DISTINCT 才会消去重复行。
方法一:列出全部字段名
方法二:用 * 表示全部字段
| cno | cn | ct |
|---|---|---|
| c1 | Java程序设计 | 40 |
| c2 | 程序设计基础 | 48 |
| c3 | 线性代数 | 48 |
| c4 | 数据结构 | 64 |
| c5 | 数据库系统 | 56 |
| c6 | 数据挖掘 | 32 |
| c7 | 高等数学 | 60 |
| c8 | 控制理论 | 32 |
可以为字段名指定别名,查询结果中别名会代替字段名显示。
| 课程号 | 课程名 | 课时 |
|---|---|---|
| c1 | Java程序设计 | 40 |
| c2 | 程序设计基础 | 48 |
| c3 | 线性代数 | 48 |
| c4 | 数据结构 | 64 |
| c5 | 数据库系统 | 56 |
| c6 | 数据挖掘 | 32 |
| c7 | 高等数学 | 60 |
| c8 | 控制理论 | 32 |
查询讲授课程的教师的教师号。
| tno |
|---|
| t1 |
| t2 |
| t3 |
| t4 |
| t5 |
查询前 3 位学生的姓名、学号和专业。
| sn | sno | maj |
|---|---|---|
| 王彤 | s1 | 计算机 |
| 苏乐 | s2 | 信息 |
| 林欣怡 | s3 | 信息 |
条件查询
使用 WHERE 子句指定查询条件,精确筛选所需数据
| 运算符 | 含义 |
|---|---|
| =, >, <, >=, <=, !=, <> | 比较大小 |
| AND(&&), OR(||), NOT(!) | 多重条件(逻辑组合) |
| BETWEEN AND / NOT BETWEEN AND | 确定范围 |
| IN / NOT IN | 确定集合 |
| LIKE / NOT LIKE | 字符匹配(模糊查询) |
| IS NULL / IS NOT NULL | 空值判断 |
使用 =, >, <, >=, <=, !=, <> 进行数值或字符的比较。
| sno | cno | score |
|---|---|---|
| s1 | c1 | 90.50 |
| s4 | c1 | 93.00 |
| s7 | c7 | 100.00 |
| s8 | c3 | 96.00 |
| tno | tn | maj |
|---|---|---|
| t1 | 刘杨 | 计算机 |
| t4 | 赵礼 | 自动化 |
使用逻辑运算符 AND、OR、NOT 组合多个条件。AND 可用 && 替代,OR 可用 || 替代。
| sno | sn | sex | age | maj | dept |
|---|---|---|---|---|---|
| s1 | 王彤 | 女 | 18 | 计算机 | 信息学院 |
| s5 | 魏立 | 男 | 17 | 数学 | 理学院 |
| s6 | 何欣荣 | 女 | 21 | 计算机 | 信息学院 |
| s7 | 赵琳琳 | 女 | 19 | 数学 | 理学院 |
| 教师号 | 姓名 | 职称 |
|---|---|---|
| t1 | 刘杨 | 教授 |
| t3 | 顾伟 | 副教授 |
| t5 | 赵希希 | 副教授 |
| t6 | 张刚 | 讲师 |
查询讲授课程号"c1"或"c2"且开课日期在 2021-09-01 及之后的教师号、课程号和开课日期。
利用 BETWEEN AND 或 NOT BETWEEN AND 查询字段值属于(或不属于)指定连续区间的元组。
利用 IN 或 NOT IN 查询字段值属于(或不属于)指定集合的元组。
查询除课程号"c4"和"c6"之外其他课程的选课信息。
当不知道完全精确的值时,可使用 LIKE 或 NOT LIKE 进行模糊查询。
语法格式:<字段名> LIKE <字符串常量>,字段名必须为字符型。
%程序% → 课程名中任意位置包含"程序"即匹配。程序% → 课程名必须以"程序"开头。_据% → 第一个字符任意,第二个字符是"据",之后任意。某个字段没有值称为具有空值(NULL)。空值不同于零和空格,它不占任何存储空间。
IS NULL / IS NOT NULL,不能用 = NULL。
聚合函数查询
SQL 提供的聚合函数可以对一组值进行计算并返回单个值
查询学号为"s2"的学生的总分和平均分。
本例使用的模拟数据表(sc):
| sno | cno | score |
|---|---|---|
| s2 | c2 | 78.00 |
| s2 | c3 | 82.00 |
| s2 | c5 | NULL |
| s2 | c7 | 91.00 |
运行结果:
| 总分 | 平均分 |
|---|---|
| 251.00 | 83.67 |
本例使用的模拟数据表(c):
| cno | cn | ct |
|---|---|---|
| c1 | Java程序设计 | 40 |
| c2 | 程序设计基础 | 48 |
| c3 | 线性代数 | 48 |
| c4 | 数据结构 | 64 |
| c5 | 数据库系统 | 56 |
| c6 | 数据挖掘 | 32 |
| c7 | 高等数学 | 60 |
| c8 | 控制理论 | 32 |
运行结果:
| 最高课时 | 最低课时 | 最大课时差 |
|---|---|---|
| 64 | 32 | 32 |
查询学号为"s1"的学生的选课门数。
本例使用的模拟数据表(sc):
| sno | cno | score |
|---|---|---|
| s1 | c1 | 90.50 |
| s1 | c2 | 86.00 |
| s1 | c4 | 88.00 |
运行结果:
| sno | 选课门数 |
|---|---|
| s1 | 3 |
查询学生表中的专业数量。
本例使用的模拟数据表(s):
| sno | sn | maj |
|---|---|---|
| s1 | 王彤 | 计算机 |
| s2 | 苏乐 | 信息 |
| s3 | 林欣怡 | 信息 |
| s4 | 赵晨 | 自动化 |
| s5 | 魏立 | 数学 |
| s6 | 何欣荣 | 计算机 |
| s7 | 赵琳琳 | 数学 |
| s8 | 周宁 | 信息 |
运行结果:
| 专业数量 |
|---|
| 4 |
查询"信息学院"的教师数量。
本例使用的模拟数据表(t):
| tno | tn | dept |
|---|---|---|
| t1 | 刘杨 | 信息学院 |
| t2 | 陈敏 | 信息学院 |
| t3 | 顾伟 | 信息学院 |
| t4 | 赵礼 | 自动化学院 |
| t5 | 赵希希 | 信息学院 |
| t6 | 张刚 | 信息学院 |
运行结果:
| dept | 教师数量 |
|---|---|
| 信息学院 | 5 |
分组查询
GROUP BY 子句将查询结果按指定字段分组,配合聚合函数进行组内统计
本例使用的模拟数据表(sc):
| sno | cno | score |
|---|---|---|
| s1 | c1 | 90.50 |
| s1 | c2 | 86.00 |
| s1 | c4 | 88.00 |
| s2 | c2 | 78.00 |
| s2 | c3 | 82.00 |
| s2 | c5 | NULL |
| s2 | c7 | 91.00 |
| s3 | c4 | 80.00 |
| s3 | c5 | 84.00 |
| s4 | c1 | 93.00 |
| s4 | c5 | 89.00 |
| s5 | c3 | 67.00 |
| s5 | c4 | 79.00 |
| s5 | c5 | 76.00 |
| s6 | c4 | 95.00 |
| s6 | c5 | 90.00 |
| s7 | c7 | 100.00 |
| s8 | c3 | 96.00 |
| s8 | c6 | 85.00 |
运行结果:
| 课程号 | 选课人数 |
|---|---|
| c1 | 2 |
| c2 | 2 |
| c3 | 3 |
| c4 | 4 |
| c5 | 5 |
| c6 | 1 |
| c7 | 2 |
查询选修三门以上(含三门)课程的学生的学号和选课门数。
本例仍使用上面的 sc 表模拟数据。
运行结果:
| 学号 | 选课门数 |
|---|---|
| s1 | 3 |
| s2 | 4 |
| s5 | 3 |
WHERE
作用于基本表或视图,从中选择满足条件的元组(行)。
在分组之前执行。
HAVING
作用于组,选择满足条件的分组。
在分组之后执行,必须跟在 GROUP BY 之后。
查询结果排序
ORDER BY 子句对查询结果进行排序,ASC 升序(默认),DESC 降序
- ORDER BY 子句必须出现在其他子句(WHERE、GROUP BY、HAVING)之后。
DESC为降序,ASC为升序,缺省时默认升序。- 可以指定多个排序字段,前面的是主排序字段,后面的是次排序字段。
查询学号为"s2"的选课信息,按成绩降序排列。
本例使用的模拟数据表(sc):
| sno | cno | score |
|---|---|---|
| s2 | c2 | 78.00 |
| s2 | c3 | 82.00 |
| s2 | c5 | NULL |
| s2 | c7 | 91.00 |
运行结果:
| sno | cno | score |
|---|---|---|
| s2 | c7 | 91.00 |
| s2 | c3 | 82.00 |
| s2 | c2 | 78.00 |
| s2 | c5 | NULL |
查询课程信息,按课时降序排列。
本例使用的模拟数据表(c):
| cno | cn | ct |
|---|---|---|
| c1 | Java程序设计 | 40 |
| c2 | 程序设计基础 | 48 |
| c3 | 线性代数 | 48 |
| c4 | 数据结构 | 64 |
| c5 | 数据库系统 | 56 |
| c6 | 数据挖掘 | 32 |
| c7 | 高等数学 | 60 |
| c8 | 控制理论 | 32 |
运行结果:
| cno | cn | ct |
|---|---|---|
| c4 | 数据结构 | 64 |
| c7 | 高等数学 | 60 |
| c5 | 数据库系统 | 56 |
| c2 | 程序设计基础 | 48 |
| c3 | 线性代数 | 48 |
| c1 | Java程序设计 | 40 |
| c6 | 数据挖掘 | 32 |
| c8 | 控制理论 | 32 |
查询课程信息,按课时降序排列,课时相同再按课程名降序排列。
本例仍使用上面的 c 表模拟数据。
运行结果:
| cno | cn | ct |
|---|---|---|
| c4 | 数据结构 | 64 |
| c7 | 高等数学 | 60 |
| c5 | 数据库系统 | 56 |
| c3 | 线性代数 | 48 |
| c2 | 程序设计基础 | 48 |
| c1 | Java程序设计 | 40 |
| c6 | 数据挖掘 | 32 |
| c8 | 控制理论 | 32 |
限制查询结果数量(LIMIT)
LIMIT 子句用来限制查询结果返回的行数,常用于分页
- OFFSET:偏移量(非负整数),默认为 0。OFFSET=0 表示第 1 行,OFFSET=1 表示第 2 行,以此类推。
- row_count:返回的行数(非负整数)。若超过实际行数,则返回实际行数。
LIMIT 1, 3 与 LIMIT 3 OFFSET 1 完全等价,都表示从第 2 行开始取 3 行。
本例使用的模拟数据表(t):
| tno | tn | prof |
|---|---|---|
| t1 | 刘杨 | 教授 |
| t2 | 陈敏 | 讲师 |
| t3 | 顾伟 | 副教授 |
| t4 | 赵礼 | 教授 |
| t5 | 赵希希 | 副教授 |
| t6 | 张刚 | 讲师 |
运行结果:
| tno | tn | prof |
|---|---|---|
| t2 | 陈敏 | 讲师 |
| t3 | 顾伟 | 副教授 |
| t4 | 赵礼 | 教授 |
查询每门课程的选课人数,按选课人数降序排列,显示前 3 行。
本例使用的模拟数据表(sc):
| sno | cno | score |
|---|---|---|
| s1 | c1 | 90.50 |
| s1 | c2 | 86.00 |
| s1 | c4 | 88.00 |
| s2 | c2 | 78.00 |
| s2 | c3 | 82.00 |
| s2 | c5 | NULL |
| s2 | c7 | 91.00 |
| s3 | c4 | 80.00 |
| s3 | c5 | 84.00 |
| s4 | c1 | 93.00 |
| s4 | c5 | 89.00 |
| s5 | c3 | 67.00 |
| s5 | c4 | 79.00 |
| s5 | c5 | 76.00 |
| s6 | c4 | 95.00 |
| s6 | c5 | 90.00 |
| s7 | c7 | 100.00 |
| s8 | c3 | 96.00 |
| s8 | c6 | 85.00 |
运行结果:
| 课程号 | 选课人数 |
|---|---|
| c5 | 5 |
| c4 | 4 |
| c3 | 3 |
执行顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT